Comparable과 Comparator 인터페이스

✒️ 2025-05-30 09:12 내용 수정


1. Comparable 인터페이스

객체를 정렬하는데 사용되는 메서드인 compareTo() 메서드를 정의하는 인터페이스

메서드 설명
int compareTo(T o) 해당 객체와 전달된 객체의 순서를 비교함
public class Test implements Comparable<Test> {
	private int id;

	public Test(int id) {
		this.id = id;
	}

	@Override  
    public int compareTo(Test t) {  
	    // 오름차순 정렬
        return Integer.compare(this.id, t.id);  

		// 또는
		// return this.id - t.id;
    } 
}
public class Test implements Comparable<Test> {
	public int id;
	
	@Override  
    public int compareTo(Test t) {  
        // 내림차순 정렬
        return Integer.compare(t.id, this.id);
        
        // 또는 - 기호로 표시
        //return -Integer.compare(this.id, t.id);
    } 
}

예시

public class Video implements Comparable<Video> {  
    private String title;  
    private int views;  
  
    public Video(String title, int views) {  
        this.title = title;  
        this.views = views;  
    }  

    @Override  
    public int compareTo(Video v1) {  
	    // 오름차순 정렬
        return Integer.compare(this.views, v1.views);  
    }  
  
    @Override  
    public String toString() {  
        return title + " : " + views +"회";  
    }  
  
    public int getViews() {  
        return views;  
    }  
}
import java.util.Arrays;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  
  
public class Main {  
    public static void main(String[] args) {  
        List<Video> list = Arrays.asList(  
            new Video("a", 200),  
            new Video("b", 94732),  
            new Video("c", 1432),  
            new Video("d", 203),  
            new Video("e", 87332)  
        );  
        System.out.println(list);  

		// compareTo를 사용한 오름차순 정렬
        Collections.sort(list);  
        System.out.println(list);  
}
[a : 200회, b : 94732회, c : 1432회, d : 203회, e : 87332회]
[a : 200회, d : 203회, c : 1432회, e : 87332회, b : 94732회]

2. Comparator 인터페이스

Comparable 인터페이스와 같이 객체를 정렬하는데 사용되는 인터페이스

메서드 설명
int compareTo(T o1, T o2) 전달된 두 객체의 순서를 비교함
boolean equals(Object obj) 해당 comparator와 전달된 객체가 같은지 확인
default Comparator<T> reversed() 해당 comparator의 역순인 comparator를 반환
static <T extends Comparable<? super T>> Comparator<T> reversedOrder() 자연 순서(natural ordering)의 역순 comparator를 반환
default Compartor<T> thenComparing(Comparator<? super T> other) Comparable 정렬 키를 추출하는 함수를 사용하여 사전식 순서 comparator를 반환
정렬을 진행한 후 추가 정렬을 진행하는 경우에 사용

예시

public class Video implements Comparable<Video> {  
    private String title;  
    private int views;  
  
    public Video(String title, int views) {  
        this.title = title;  
        this.views = views;  
    }  

    @Override  
    public int compareTo(Video v1) {  
	    // 오름차순 정렬
        return Integer.compare(this.views, v1.views);  
    }  
  
    @Override  
    public String toString() {  
        return title + " : " + views +"회";  
    }  
  
    public int getViews() {  
        return views;  
    }  

	public String getTitle() {  
	    return title;  
	}
}
import java.util.Arrays;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  
  
public class Main {  
    public static void main(String[] args) {  
		List<Video> list = Arrays.asList(  
		    new Video("A Test", 200),  
		    new Video("Code", 94732),  
		    new Video("November Playlist", 1432),  
		    new Video("Description", 203),  
		    new Video("오늘의 날씨", 87332),  
		    new Video("뉴스", 94732),  
		    new Video("New 주간 신작 영화", 1432)  
		);  
		  
		System.out.println("조회수 내림차순");  
		list.sort(Comparator.comparing((Video v)-> -v.getViews()));  
		  
		for(Video v : list) {  
		    System.out.println(v.toString());  
		}  
		  
		System.out.println();  
		System.out.println("제목 오름차순");  
		list.sort(Comparator.comparing((Video v)-> v.getTitle()));  
		  
		for(Video v : list) {  
		    System.out.println(v.toString());  
		}  
		  
		System.out.println();  
		System.out.println("조회수 내림차순 + 제목 오름차순");  
		list.sort(  
		    Comparator.comparing((Video v)-> -v.getViews())  
		            .thenComparing((Video v)-> v.getTitle())  
		);  
		  
		for(Video v : list) {  
		    System.out.println(v.toString());  
		}
}
조회수 내림차순
Code : 94732회
뉴스 : 94732회
오늘의 날씨 : 87332회
November Playlist : 1432회
New 주간 신작 영화 : 1432회
Description : 203회
A Test : 200회

제목 오름차순
A Test : 200회
Code : 94732회
Description : 203회
New 주간 신작 영화 : 1432회
November Playlist : 1432회
뉴스 : 94732회
오늘의 날씨 : 87332회

조회수 내림차순 + 제목 오름차순
Code : 94732회
뉴스 : 94732회
오늘의 날씨 : 87332회
New 주간 신작 영화 : 1432회
November Playlist : 1432회
Description : 203회
A Test : 200회